﻿using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Forms;

using ContextMenu = System.Windows.Controls.ContextMenu;
using MenuItem = System.Windows.Controls.MenuItem;

namespace Poet
{
    /// <summary>
    /// TODO: Update summary.
    /// </summary>
    public class NotifyIconManager
    {
        private readonly Window _window;
        
        private readonly ContextMenu _contextMenu;

        private readonly VisualStateViewModel _visualStateViewModel;

        public WindowState CurrentWindowState { get; set; }

        private NotifyIcon _notifyIcon;

        public NotifyIconManager(Window window, ContextMenu menu)
        {
            _window = window;
            _contextMenu = menu;
     
            CreateTrayIcon();
        }

        public NotifyIconManager(Window window, string menuResourceName)
        {
            _window = window;
            _contextMenu = (ContextMenu)_window.Resources[menuResourceName];

            CreateTrayIcon();
        }

        private void CreateTrayIcon()
        {
            _window.StateChanged += OnStateChanged;
            _window.Closing += OnClosing;

            _notifyIcon = new NotifyIcon { Icon = Properties.Resources.Poet, Text = @"Here is tray icon text." };

            _notifyIcon.Click += (sender, e) =>
            {
                if ((e as MouseEventArgs).Button == MouseButtons.Left)
                {
                    ShowHideMainWindow(sender, null);
                }
                else
                {
                    _contextMenu.IsOpen = true;
                    this._window.Activate();
                }
            };

            _notifyIcon.Visible = true; // делаем иконку видимой в трее
        }

        private void ShowHideMainWindow(object sender, RoutedEventArgs e)
        {
            _contextMenu.IsOpen = false; // спрячем менюшку, если она вдруг видима
            if (this._window.IsVisible)
            {
                this._window.Hide();
                (_contextMenu.Items[0] as MenuItem).Header = "Show";
            }
            else
            {
                this._window.Show();
                (_contextMenu.Items[0] as MenuItem).Header = "Hide";
                this._window.WindowState = CurrentWindowState;
                this._window.Activate();
            }
        }

        protected void OnStateChanged(object sender, EventArgs e)
        {
            if (this._window.WindowState == WindowState.Minimized)
            {
                this._window.Hide();
                ((MenuItem)_contextMenu.Items[0]).Header = "Show";
            }
            else
            {
                CurrentWindowState = this._window.WindowState;
            }
        }

        public bool CanClose { get; set; }

        // переопределяем обработчик запроса выхода из приложения
        protected void OnClosing(object sender, CancelEventArgs e)
        {
            if (!CanClose)
            {
                // если нельзя закрывать
                e.Cancel = true; //выставляем флаг отмены закрытия
                // запоминаем текущее состояние окна
                CurrentWindowState = this._window.WindowState;
                // меняем надпись в менюшке
                CurrentWindowState = _window.WindowState;
                (_contextMenu.Items[0] as MenuItem).Header = "Show";
                // прячем окно
                this._window.Hide();
                _window.Hide();
            }
            else
            {
                _notifyIcon.Visible = false;
            }
        }

        private void MenuExitClick(object sender, RoutedEventArgs e)
        {
            CanClose = true;
            this._window.Close();
        }
    }
}
